package com.lxw.report.engine.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;

public class CellFormatUtil {

    //报表单元格格式化所需
    public  static DecimalFormat decimalFormat= new DecimalFormat();
    public static Map<String,String> formatMap =new HashMap<>();
    static{
        /**
         * 不做任何处理
         */
        formatMap.put("10","");
        /**
         * 保留小数位数0位到4位
         */
        formatMap.put("0","##0");
        formatMap.put("1","##0.0");
        formatMap.put("2","##0.00");
        formatMap.put("3","##0.000");
        formatMap.put("4","##0.0000");
    }

    public static String cellFormat(String displayFormat,Object cellValue){
        String valueStr="";
        //如果为0代表不需要格式化
        int decimals=0;
        //获得页面设置的设置格式的类型
        boolean perFormat=false;
        boolean afterFormat=false;
        int formatCount=0;
        boolean thousandth=false;
        if(displayFormat!=null){
            try {
                JSONObject formatObject = JSON.parseObject(displayFormat);
                perFormat=formatObject.getBoolean("perFormat")==null?false:formatObject.getBoolean("perFormat");
                afterFormat=formatObject.getBoolean("afterFormat")==null?false:formatObject.getBoolean("afterFormat");
                String formatCountStr=formatObject.getString("formatCount");
                if(formatCountStr!=null&&!"".equals(formatCountStr)){
                    formatCount=Integer.parseInt(formatCountStr);
                }
                thousandth=formatObject.getBoolean("thousandth");
            }catch (Exception e){
                perFormat=false;
                afterFormat=false;
                formatCount=0;
                thousandth=false;
            }
        }
        if(perFormat||afterFormat||thousandth){
            decimals=1;
        }
        //如果不需要进行格式化或者为null或者空字符串，那么不格式化
        if(decimals==0||cellValue == null||"".equals(cellValue.toString())){
            return (cellValue == null) ? "" : cellValue.toString();
        }else {
            return getFormatValue( perFormat, afterFormat, formatCount, thousandth, valueStr,cellValue);
        }
    }

    private static String getFormatValue(boolean perFormat,boolean afterFormat,int formatCount,boolean thousandth,String valueStr,Object cellValue){
        //如果设置了保留小数的位数，那么可以直接进行格式转换
        if(afterFormat){
            //进行格式的调整
            String format= formatMap.get(formatCount+"");
            //如果设置了百分比
            if(perFormat){
                format+="%";
            }
            //增加千分符设置
            if(thousandth){
                format=","+format;
            }
            try{
                valueStr=cellValue.toString();
                //判断是否是数字类型，如果该值不是数字类型，那么就不进行格式化
                if(isNumber(valueStr)){
                    valueStr=decimalFormat(format,decimalFormat.parse(valueStr));
                }
            }catch (Exception e){
                e.printStackTrace();
            }
        }else {
            int length=valueStr.indexOf(".");
            String format="";
            //如果该数值没有小数点
            if(length==-1){
                format=formatMap.get("0");
                if(perFormat){
                    format+="%";
                }
                if(thousandth){
                    format=","+format;
                }
                try{
                    valueStr=cellValue.toString();
                    //判断是否是数字类型，如果该值不是数字类型，那么就不进行格式化
                    if(isNumber(valueStr)){
                        valueStr=decimalFormat(format,decimalFormat.parse(valueStr));
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }else{
                format=formatMap.get("0")+".";
                int afterCount=valueStr.length()-valueStr.indexOf(".")-1;
                for(int i=0;i<afterCount;i++){
                    format+="0";
                }
                if(perFormat){
                    format+="%";
                }
                if(thousandth){
                    format=","+format;
                }
                try{
                    valueStr=cellValue.toString();
                    //判断是否是数字类型，如果该值不是数字类型，那么就不进行格式化
                    if(isNumber(valueStr)){
                        valueStr=decimalFormat(format,decimalFormat.parse(valueStr));
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
        return valueStr;
    }

    public static String decimalFormat(String pattern,Object value){
        DecimalFormat decimalFormat=new DecimalFormat(pattern);
        String result=decimalFormat.format(value);
        return result;
    }

    public static boolean isNumber(final String value) {
        return Pattern.matches("^-?(?:\\d+|\\d{1,3}(?:,\\d{3})+)?(?:\\.\\d+)?$", value);
    }

}
